// 对线程创建进行封装
#pragma once
#include <pthread.h>
#include <functional>
#include <string>
#include <cassert>

class Thread
{
private:
    using func_t = std::function<void *(void *)>;
    const int num = 1024;

private:
    static void *start_routine(void *args)
    {
        Thread *td = static_cast<Thread *>(args);
        return td->callback();
    }

public:
    Thread()
    {
        char buffername[num];
        snprintf(buffername, sizeof buffername, "thread - %d", threadNum++);
        _name = buffername;
    }

    ~Thread()
    {
        // do noting
    }

    // start的时候，传递调用函数，以及参数
    void start(func_t func, void *args)
    {
        _func = func;
        _args = args;
        pthread_create(&_tid, nullptr, start_routine, this); // 内部函数，没有this指针
    }

    // 回收线程，对线程进行join
    void join()
    {
        int n = pthread_join(_tid, nullptr);
        assert(0 == n);
        (void)n;
    }

    void *callback()
    {
        return _func(_args);
    }

    // 从外部获取线程名称
    std::string threadName()
    {
        return _name;
    }

private:
    func_t _func;      // 线程调用的函数
    std::string _name; // 线程名
    void *_args;       // 参数
    static int threadNum;
    pthread_t _tid; // 线程的tid
};
int Thread::threadNum = 1;